package com.harzone.commons.search.domain;

import java.util.LinkedList;

import com.harzone.commons.search.visitor.WhereVisitor;

/**
 * where条件
 * @author ls
 * 2014年11月21日下午2:06:23
 */
public class Where implements Cloneable {

	/**
	 * where条件连接类型
	 * @author ls
	 * 2014年11月21日下午2:07:34
	 */
	public static enum CONN {
		AND, OR
	};

	public static Where newInstance() {
		return new Where(CONN.AND);
	}
	

	public static Where newInstance(String connStr) {
		return new Where(connStr);
	}

	private LinkedList<Where> wheres = new LinkedList<>();

	protected CONN conn = CONN.AND;

	/**
	 * 
	 * @param connStr and 或者or
	 */
	public Where(String connStr) {
		this.conn = CONN.valueOf(connStr.toUpperCase());
	}

	public Where(CONN conn) {
		this.conn = conn;
	}

	public void addWhere(Where where) {
		wheres.add(where);
	}

	public CONN getConn() {
		return this.conn;
	}
	
	public Where setConn(CONN conn) {
		this.conn = conn;
		return this;
	}

	public Where setConn(String connStr) {
		this.conn = CONN.valueOf(connStr.toUpperCase());
		return this;
	}

	public LinkedList<Where> getWheres() {
		return wheres;
	}

	/**
	 * 是否存在where条件
	 * @author ls
	 * 2014年11月21日下午5:33:31 
	 * @return
	 */
	public boolean hasWhere(){
		return !this.wheres.isEmpty();
	}
	
	@Override
	public String toString(){
		if(wheres.size()>0){
			String whereStr = wheres.toString() ;
			return this.conn + " ( "+whereStr.substring(1,whereStr.length()-1)+" ) " ;
		}else{
			return "" ;
		}
		
	}
	
	public void accept(WhereVisitor visitor) {
		visitor.visit(this);
	}
}
